#include <iostream>
#include <memory>

using namespace std;

// 前向声明
class ClassB;

class ClassA
{
public:
    shared_ptr<ClassB> b_ptr;

    ClassA() { cout << "ClassA 构造函数" << endl; }
    ~ClassA() { cout << "ClassA 析构函数" << endl; }

    void setB(shared_ptr<ClassB> b)
    {
        b_ptr = b;
    }
};

class ClassB
{
public:
    // 这里使用 shared_ptr 会导致循环引用
    shared_ptr<ClassA> a_ptr;

    // 使用 weak_ptr 可以解决循环引用问题
    // weak_ptr<ClassA> a_ptr;

    ClassB() { cout << "ClassB 构造函数" << endl; }
    ~ClassB() { cout << "ClassB 析构函数" << endl; }

    void setA(shared_ptr<ClassA> a)
    {
        a_ptr = a;
    }
};

int main()
{
    cout << "=== 创建对象 ===" << endl;
    shared_ptr<ClassA> a = make_shared<ClassA>();
    shared_ptr<ClassB> b = make_shared<ClassB>();

    cout << "\n=== 建立循环引用 ===" << endl;
    a->setB(b);
    b->setA(a);

    cout << "\n=== 引用计数 ===" << endl;
    cout << "a 的引用计数: " << a.use_count() << endl;
    cout << "b 的引用计数: " << b.use_count() << endl;

    cout << "\n=== main 函数结束 ===" << endl;
    // 由于循环引用，对象不会被正确销毁
    // 注意观察析构函数是否被调用

    return 0;
}